#include <stdio.h>
#include <string.h>
#include "symtab.h"

/*
 *  Cada linha da tabela de símbolos possuem 5 atributos, índice, nível léxico, categoria, tipo e offset
 * */

char idlex_tape[MAXIDLEXLEN];
char idlex_val[MAXIDLEXLEN];
int symtab[MAXSYMTABENTRIES][MAXSYMTABCOLUMNS];
int idlex_length=0, idlex_index=0, symtab_nextentry=1;

int symtab_lookup(char const *query){
  int i;
  for(i= symtab_nextentry - 1;i>0;i--){
    if ( !strcmp(&idlex_tape[symtab[i][0]], query) ){
      return i; 
    }
  }
  return 0;
}

int symtab_insert(char const *query){
  idlex_length = strlen(query);

  /*
  Verifica entrada duplicada
  Verifica se teve estouro de fita
  Verifica se teve estoura na tabela de símbolos
  */

  if ( symtab_lookup(query) ){
    fprintf(stderr, "duplicate entry for symbol %s", query);
    return -3;
  } else if ( (idlex_index + idlex_length) > MAXIDLEXLEN - 1 ) {
    fprintf(stderr, "lextape overflow");
    return -2;
  }
 
  if ( symtab_nextentry > MAXSYMTABENTRIES - 1 ) {
    fprintf(stderr, "symtab overflow");
    return -1;
  }

  /*
  Após verificações de erros

  insere o indice do lexema na fita
  insere o nível léxico
  insere a categoria léxica
  escreve na fita
  atualiza index e seta último carácter como 0
  
  */

  symtab[symtab_nextentry][LEXINDEX] = idlex_index;
  symtab[symtab_nextentry][LEXLEVEL] = lexlevel;
  symtab[symtab_nextentry][LEXCATEGORY] = lexcategory;
  strcpy(&idlex_tape[idlex_index], query);
  idlex_index += idlex_length;
  idlex_tape[idlex_index++] = 0;
  return symtab_nextentry++; 
}

